home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / osi / isode / dosisode / DOSISODE80.ZIP / SOCKETS / WATTCP.H < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-12  |  12.2 KB  |  419 lines

  1. #define WATTCPH
  2.  
  3. #define SOCKESTABLISHED 1
  4. #define SOCKDATAREADY   2
  5. #define SOCKCLOSED      4
  6.  
  7. /*
  8. #define DEBUG
  9. */
  10. /*
  11. #define MoveW( a , b, c ) movmem( a, b,c )
  12. #define busyouta(c) (putch(c))
  13. */
  14.  
  15.  
  16. #include <stdio.h>
  17. #include "elib.h"
  18.  
  19. #define set_mstimeout( x ) (set_timeout(0)+ (x / 55))
  20.  
  21. #define MAX_GATE_DATA 12
  22. #define MAX_NAMESERVERS 10
  23. #define MAX_COOKIES 10
  24. #define MAX_STRING 50    /* most strings are limited */
  25.  
  26. #define MAXVJSA     1440 /* 10 s */
  27. #define MAXVJSD     360  /* 10 s */
  28. #define SAFETYTCP  0x538f25a3L
  29. #define SAFETYUDP  0x3e45e154L
  30. #define TRUE        1
  31. #define true        TRUE
  32. #define FALSE       0
  33. #define false       FALSE
  34.  
  35. /* These are Ethernet protocol numbers but I use them for other things too */
  36. #define UDP_PROTO  0x11
  37. #define TCP_PROTO  0x06
  38. #define ICMP_PROTO 0x01
  39.  
  40. #define TCP_MODE_BINARY  0       /* default mode */
  41. #define TCP_MODE_ASCII   1
  42. #define UDP_MODE_CHK     0       /* default to having checksums */
  43. #define UDP_MODE_NOCHK   2       /* turn off checksums */
  44. #define TCP_MODE_NAGLE   0       /* Nagle algorithm */
  45. #define TCP_MODE_NONAGLE 4
  46.  
  47.  
  48. typedef int (*procref)();
  49.  
  50. typedef unsigned long longword;     /* 32 bits */
  51. typedef unsigned short word;        /* 16 bits */
  52. typedef unsigned char byte;         /*  8 bits */
  53. typedef byte eth_address[6];
  54.  
  55. /* undesirable */
  56. extern longword MsecClock();
  57. #define clock_ValueRough() MsecClock()
  58.  
  59. #define TICKS_SEC 18
  60.  
  61. #define checksum( p, len) inchksum( p, len )
  62.  
  63. #define PD_ETHER 1
  64. #define PD_SLIP  6
  65.  
  66. extern word sock_inactive;      /* in pcbootp.c */
  67. extern word _pktdevclass;
  68. extern word _mss;
  69. extern word _bootptimeout;    /* in pcbootp.c */
  70. extern longword _bootphost;    /* in pcbootp.c */
  71. extern word _bootpon;
  72.  
  73. /* The Ethernet header */
  74. typedef struct {
  75.     eth_address     destination;
  76.     eth_address     source;
  77.     word            type;
  78. } eth_Header;
  79.  
  80. /* The Internet Header: */
  81. typedef struct {
  82.     unsigned        hdrlen  : 4;
  83.     unsigned        ver     : 4;
  84.     byte        tos;
  85.     word            length;
  86.     word            identification;
  87.     word            frag;
  88.     byte        ttl;
  89.     byte        proto;
  90.     word            checksum;
  91.     longword        source;
  92.     longword        destination;
  93. } in_Header;
  94.  
  95.  
  96. #ifdef WATTCPH
  97. #define in_GetVersion(ip) ( (ip)->ver )
  98. #define in_GetHdrlen(ip)  ( (ip)->hdrlen )  /* 32 bit word size */
  99. #define in_GetHdrlenBytes(ip)  ( in_GetHdrlen(ip) << 2 ) /* 8 bit byte size */
  100. #define in_GetTos(ip)      ( (ip)->tos)
  101.  
  102. #define in_GetTTL(ip)      ((ip)->ttl)
  103. #define in_GetProtocol(ip) ((ip)->proto )
  104.  
  105. #else
  106. /*
  107. #define in_GetVersion(ip) (((ip)->vht >> 12) & 0xf)
  108. #define in_GetHdrlen(ip)  (((ip)->vht >> 8) & 0xf)
  109. #define in_GetHdrlenBytes(ip)  (((ip)->vht >> 6) & 0x3c)
  110. #define in_GetTos(ip)      ((ip)->vht & 0xff)
  111.  
  112. #define in_GetTTL(ip)      ((ip)->ttlProtocol >> 8)
  113. #define in_GetProtocol(ip) ((ip)->ttlProtocol & 0xff)
  114. */
  115. #endif WATTCPH
  116. typedef struct {
  117.     word        srcPort;
  118.     word        dstPort;
  119.     word        length;
  120.     word        checksum;
  121. } udp_Header;
  122.  
  123. #define UDP_LENGTH ( sizeof( udp_Header ))
  124.  
  125. typedef struct {
  126.     word            srcPort;
  127.     word            dstPort;
  128.     longword        seqnum;
  129.     longword        acknum;
  130.     word            flags;
  131.     word            window;
  132.     word            checksum;
  133.     word            urgentPointer;
  134. } tcp_Header;
  135.  
  136. #define tcp_FlagFIN     0x0001
  137. #define tcp_FlagSYN     0x0002
  138. #define tcp_FlagRST     0x0004
  139. #define tcp_FlagPUSH    0x0008
  140. #define tcp_FlagACK     0x0010
  141. #define tcp_FlagURG     0x0020
  142. #define tcp_FlagDO      0xF000
  143. #define tcp_GetDataOffset(tp) (intel16((tp)->flags) >> 12)
  144.  
  145. /* The TCP/UDP Pseudo Header */
  146. typedef struct {
  147.     longword    src;
  148.     longword    dst;
  149.     byte        mbz;
  150.     byte        protocol;
  151.     word        length;
  152.     word        checksum;
  153. } tcp_PseudoHeader;
  154.  
  155. /*
  156.  * TCP states, from tcp manual.
  157.  * Note: close-wait state is bypassed by automatically closing a connection
  158.  *       when a FIN is received.  This is easy to undo.
  159.  */
  160. #define tcp_StateLISTEN  0      /* listening for connection */
  161. #define tcp_StateSYNSENT 1      /* syn sent, active open */
  162. #define tcp_StateSYNREC  2      /* syn received, synack+syn sent. */
  163. #define tcp_StateESTAB   3      /* established */
  164. #define tcp_StateESTCL   4      /* established, but will FIN */
  165. #define tcp_StateFINWT1  5      /* sent FIN */
  166. #define tcp_StateFINWT2  6      /* sent FIN, received FINACK */
  167. #define tcp_StateCLOSWT  7      /* received FIN waiting for close */
  168. #define tcp_StateCLOSING 8      /* sent FIN, received FIN (waiting for FINACK) */
  169. #define tcp_StateLASTACK 9      /* fin received, finack+fin sent */
  170. #define tcp_StateTIMEWT  10     /* dally after sending final FINACK */
  171. #define tcp_StateCLOSEMSL 11
  172. #define tcp_StateCLOSED  12     /* finack received */
  173.  
  174. #define tcp_MaxBufSize 2048         /* maximum bytes to buffer on input */
  175.  
  176.  
  177.  
  178. /*
  179.  * UDP socket definition
  180.  */
  181. typedef struct _udp_socket {
  182.     struct _udp_socket *next;
  183.     word        ip_type;        /* always set to UDP_PROTO */
  184.     char       *err_msg;        /* null when all is ok */
  185.     void      (*usr_yield)();
  186.     word        sock_mode;            /* a logical OR of bits */
  187.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  188.     procref        dataHandler;
  189.     eth_address     hisethaddr;        /* peer's ethernet address */
  190.     longword        hisaddr;        /* peer's internet address */
  191.     word        hisport;        /* peer's UDP port */
  192.     longword        myaddr;
  193.     word        myport;
  194.  
  195.     int             queuelen;
  196.     byte           *queue;
  197.  
  198.     int             rdatalen;           /* must be signed */
  199.     word            maxrdatalen;
  200.     byte           *rdata;
  201.     byte            rddata[ tcp_MaxBufSize + 1];         /* if dataHandler = 0, len == 512 */
  202.     longword        safetysig;
  203. } udp_Socket;
  204. /*
  205.  * TCP Socket definition
  206.  */
  207.  
  208.  
  209. typedef struct _tcp_socket {
  210.     struct _tcp_socket *next;
  211.     word        ip_type;        /* always set to TCP_PROTO */
  212.     char        *err_msg;
  213.     void      (*usr_yield)();
  214.     word        sock_mode;        /* a logical OR of bits */
  215.  
  216.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  217.     procref         dataHandler;    /* called with incoming data */
  218.     eth_address     hisethaddr;     /* ethernet address of peer */
  219.     longword        hisaddr;        /* internet address of peer */
  220.     word            hisport;        /* tcp ports for this connection */
  221.     longword        myaddr;
  222.     word        myport;
  223.  
  224.     int             queuelen;
  225.     byte           *queue;
  226.  
  227.     int             rdatalen;       /* must be signed */
  228.     word            maxrdatalen;
  229.     byte           *rdata;
  230.     byte            rddata[tcp_MaxBufSize+1];    /* received data */
  231.     longword        safetysig;
  232.     word        state;          /* connection state */
  233.  
  234.     longword        acknum;
  235.     longword        seqnum;         /* data ack'd and sequence num */
  236.     long            timeout;        /* timeout, in milliseconds */
  237.     byte            unhappy;        /* flag, indicates retransmitting segt's */
  238.     byte            recent;         /* 1 if recently transmitted */
  239.     word            flags;          /* tcp flags word for last packet sent */
  240.  
  241.     word        window;        /* other guy's window */
  242.     int         datalen;        /* number of bytes of data to send */
  243.                     /* must be signed */
  244.     int             unacked;        /* unacked data */
  245.  
  246.     byte        cwindow;        /* Van Jacobson's algorithm */
  247.     byte        wwindow;
  248.  
  249.     word        vj_sa;        /* VJ's alg, standard average */
  250.     word        vj_sd;        /* VJ's alg, standard deviation */
  251.     longword        vj_last;        /* last transmit time */
  252.     word        rto;
  253.     byte        karn_count;        /* count of packets */
  254.     byte            tos;            /* priority */
  255.     /* retransmission timeout proceedure */
  256.     /* these are in clock ticks */
  257.     longword        rtt_lasttran;       /* last transmission time */
  258.     longword        rtt_smooth;         /* smoothed round trip time */
  259.     longword        rtt_delay;          /* delay for next transmission */
  260.     longword        rtt_time;           /* time of next transmission */
  261.  
  262.     word            mss;
  263.     longword        inactive_to;           /* for the inactive flag */
  264.  
  265.     byte            data[tcp_MaxBufSize+1]; /* data to send */
  266. } tcp_Socket;
  267.  
  268. /* sock_type used for socket io */
  269. typedef union {
  270.     udp_Socket udp;
  271.     tcp_Socket tcp;
  272. } sock_type;
  273.  
  274. /* similar to UNIX */
  275. typedef struct sockaddr {
  276.     word        s_type;
  277.     word        s_port;
  278.     longword    s_ip;
  279.     byte        s_spares[6];    /* unused in TCP realm */
  280. };
  281.  
  282. extern longword my_ip_addr;
  283. extern eth_address _eth_addr;
  284. extern eth_address _eth_brdcast;
  285. extern longword sin_mask;
  286. extern word sock_delay;
  287.  
  288. /*
  289.  * ARP definitions
  290.  */
  291. #ifdef WATTCPH
  292. #define arp_TypeEther  0x100        /* ARP type of Ethernet address */
  293. #else
  294. #define arp_TypeEther  0x1        /* ARP type of Ethernet address */
  295. #endif WATTCPH
  296.  
  297. /* harp op codes */
  298. #ifdef WATTCPH
  299. #define ARP_REQUEST 0x0100
  300. #define ARP_REPLY   0x0200
  301. #else
  302. #define ARP_REQUEST 1
  303. #define ARP_REPLY   2
  304. #endif WATTCPH
  305.  
  306. /*
  307.  * Arp header
  308.  */
  309. typedef struct {
  310.     word            hwType;
  311.     word            protType;
  312.     word            hwProtAddrLen;  /* hw and prot addr len */
  313.     word            opcode;
  314.     eth_address     srcEthAddr;
  315.     longword        srcIPAddr;
  316.     eth_address     dstEthAddr;
  317.     longword        dstIPAddr;
  318. } arp_Header;
  319.  
  320. #define ETH_MSS 1400  /* MSS for Ethernet */
  321.  
  322. /*
  323.  * Ethernet interface:
  324.  */
  325.  
  326. void  _eth_init();
  327. byte *_eth_formatpacket( void *eth_dest, word eth_type );
  328. int   _eth_send( word len);
  329. void  _eth_free( void *buf);
  330. byte *_eth_arrived( word *type_ptr);
  331. void  _eth_release();
  332. void *_eth_hardware(byte *p);
  333.  
  334. void ip_timer_init();
  335. int  ip_timer_expired();
  336.  
  337. /*
  338.  * socket macros
  339.  */
  340.  
  341. /*
  342.  * sock_wait_established()
  343.  *    - waits then aborts if timeout on s connection
  344.  * sock_wait_input()
  345.  *    - waits for received input on s
  346.  *    - may not be valid input for sock_Gets... check returned length
  347.  * sock_tick()
  348.  *    - do tick and jump on abort
  349.  * sock_wait_closed();
  350.  *    - discards all received data
  351.  *
  352.  * jump to sock_err with contents of *statusptr set to
  353.  *     1 on closed
  354.  *    -1 on timeout
  355.  *
  356.  */
  357.  
  358. _ip_delay0( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  359. _ip_delay1( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  360. _ip_delay2( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  361.  
  362. #define sock_wait_established( s, seconds, fn, statusptr ) \
  363.     if (_ip_delay0( s, seconds, fn, statusptr )) goto sock_err;
  364. #define sock_wait_input( s, seconds, fn , statusptr ) \
  365.     if (_ip_delay1( s, seconds, fn, statusptr )) goto sock_err;
  366. #define sock_tick( s, statusptr ) \
  367.     if ( !tcp_tick(s)) { *statusptr = 1 ; goto sock_err; }
  368. #define sock_wait_closed(s, seconds, fn, statusptr )\
  369.     if (_ip_delay2( s, seconds, fn, statusptr )) goto sock_err;
  370.  
  371. /* in UDP_NDS.C */
  372. longword resolve();
  373.  
  374. extern int _last_cookie;
  375. extern longword _cookie[MAX_COOKIES];
  376.  
  377. extern char *def_domain;
  378. extern longword def_nameservers[MAX_NAMESERVERS];
  379. extern int _last_nameserver;
  380. extern char *_hostname;
  381.  
  382. word isaddr( char *string );
  383. longword aton( char *string );
  384.  
  385.  
  386. int _ping( longword host , longword countnum );
  387. longword _chk_ping( longword host , longword *ptr);
  388. void _arp_register( longword use, longword instead_of );
  389. _arp_resolve( longword ina, eth_address *ethap);
  390.  
  391. void * _pkt_eth_init();
  392. pkt_release();
  393. int pkt_send( char *buffer, int length );
  394. pkt_buf_wipe();
  395. pkt_buf_release( char *ptr );
  396. void * pkt_received();
  397.  
  398.  
  399.  
  400. void _add_server( int *counter, int max, longword *array, longword value );
  401. extern word debug_on;
  402. char *rip( char *s);
  403. _chk_socket( tcp_Socket *s );
  404. char *inet_ntoa( char *s, longword x );
  405. char *psocket( tcp_Socket *s );
  406. longword inet_addr( char *s );
  407. char *sockerr( tcp_Socket *s );
  408. char *sockstate( tcp_Socket *s );
  409. getpeername( tcp_Socket *s, void *dest, int *len );
  410. getsockname(  tcp_Socket *s, void *dest, int *len );
  411. longword gethostid();
  412. longword sethostid( longword ip );
  413. char *getdomainname( char *name, int length );
  414. char *setdomainname( char *string );
  415. word ntohs( word a );
  416. word htons( word a );
  417. longword ntohl( longword x );
  418. longword htonl( longword x );
  419.